// AGENTE QUE CONTROLA EL FUNCIONAMIENTO DE LA CASA SEG�N LA INFORMACI�N
// QUE RECIBE DEL AGENTE SENSORES

package correo2jadess;

import jade.core.Agent;
import jade.core.behaviours.*;

import java.io.*;

import jade.lang.acl.ACLMessage;

import java.util.Iterator;
import java.util.StringTokenizer;

import java.lang.String;

import jess.*;

public class Controlador extends Agent{
	
	protected void setup(){
		
		addBehaviour(new controlJess());
		
	}
	private int k=0;
	// Este comportamiento es el que va a usar JESS.
	class controlJess extends OneShotBehaviour {
    
    	// Declaraci�n de los hechos actuales.
    	
    	private String correo = "correo no_preanalizado";			

    
    	
    	public void action() {
    		    	
    		// Declara el motor de JESS.
	    	Rete jess = new Rete();
	    	
	    	// Analiza que el archivo JESS sea correcto.
	    	try{
		    	FileReader file = new FileReader("src/correo2jadess/correoInteligente.clp");
		    	try {
		    	     Jesp parser = new Jesp(file, jess);
				     parser.parse(false);
				 } catch (jess.JessException je) {
		                 	je.printStackTrace();
		                }
				  finally {
				     file.close();
				 }
				 }catch(IOException e) {
	             	System.err.println("Error!! No se ha podido acceder al archivo.");
             }
             
            // Carga el archivo JESS.
	    	try {
        		jess.reset();
        		jess.batch("src/correo2jadess/correoInteligente.clp");
        		
        		// Inicializa los hechos.
        		
        		jess.eval("(assert (correo no_preanalizado))");


				// Muestra los hechos iniciales.
				
	            Iterator it = jess.listFacts();
				while(it.hasNext()){
					System.out.println(it.next());	
				}
				
		    } catch (JessException ex) {
		        System.err.println(ex);
		    }
		    
		    
    		// Sensores env�a constantemente la informaci�n que recibe.
    		// Este bucle comprueba si trae informaci�n distinta a la que se 
    		// tiene actualmente para aplicarla sobre JESS.
			while(true){
				
				block(10);
				
				try{
					// La informaci�n recibida del agente Sensores viene a trav�s
					// de un mensaje ACL.
					ACLMessage msg=myAgent.receive();
	            	if(msg!=null) {
			        	String contenido=msg.getContent();
			        	
			        	// Si la tiempo aumenta o disminuye se llama a la funci�n correspondiente.
			            if (contenido.equals("preanalizar correo")){ 
			            	jess.eval("(-- ?*tiempo*)");
			            	jess.eval("(preanalizando)");
			            }
			        	else if (contenido.equals("analizar correo")){ 
			        		    jess.eval("(++ ?*tiempo*)");
			        			jess.eval("(analizando)");
			        		}
			        		// Si no es la tiempo compara la nueva informaci�n con los hechos actuales.
			        		// Si es informaci�n nueva, la a�ade y borra el hecho correspondiente. 
			        		else {
			        			
					    		StringTokenizer st = new StringTokenizer(contenido);
					    		String var = st.nextToken();
					    		
					    		StringTokenizer st2 = new StringTokenizer(correo);
					    		String var2 = st2.nextToken();
					    		
					    		if(var2.equals(var)){
					    			if(!correo.equals(contenido)){
					    				jess.eval("(retract-string \"(" + correo + ")\")");
					    				jess.eval("(assert (" + contenido + "))");
					    				correo = contenido;	
					    			}		
					    		}
					    		
					    		//st2 = new StringTokenizer(correo);
					    		//var2 = st2.nextToken();
					    		
					    				
					    		
			        		}
			        	jess.run();
			        	k++;
			        }
		        } catch (JessException ex) {
		        System.err.println(ex);
		    }	
			}
		
	
    	}
    	
    }

}